#import "Controleur.h"
#import "InfoView.h"

@implementation Controleur
//
// RÝcupÝration des valeurs dans les diffÝrentes zones de texte,
// puis appel de la mÝthode dessine dans l©objet graphe
//
- calculer:sender
{
	int i;
	if (sender != self )		// Si le sender est le bouton OK
		{	
		couleur =[[zoneCouleur  target]  indexOfItem:[zoneCouleur title]];
		pas = [zonePas floatValueAt:0];
		nbrSouris = [zoneNbrSouris intValueAt:0];
		profondeur = [zoneNbrIter intValueAt:0];
		for (i=0;i<nbrSouris;i++)
			{
			x[i] = [[matrice cellAt:(i*2):0] floatValue];
			y[i] = [[matrice cellAt:(i*2+1):0] floatValue];
			}
		}
	else [fenetre makeKeyAndOrderFront:self];
	[graphe dessine:nbrSouris:profondeur:couleur:pas:x:y];

	return self;
}

- charger:sender
//
// RÝcupÝration des valeurs initiales ainsi que des paramÜtres dans un fichier
// Attention : cette mÝthode est appellÝe soit par le menu "Open", soit par la mÝthode
// "app:openFile:type" (cas oò l©application est lancÝe par un double click sur un fichier
// ".mice"
//
{
	id panneau,cellule,leMenu,laMatrice;
	char *ext[2] = {"mice"};
	char titre[100];
	int i;
	FILE *fich;
	float r1,v1,b1,r2,v2,b2,rf,vf,bf;

	if  (sender != self)		// si le sender est le menu "Open"
		{
		panneau = [OpenPanel new];
		[panneau setTitle:"Open"];
			// Ouverture de l©OpenPanel en modal
		if ([panneau runModalForTypes:ext]) 
			strcpy(nomdefichier , [panneau filename]);  // RÝcupÝration du fichier sÝlectionnÝ
		else return self;
		}
		
	fich = fopen(nomdefichier,"r");			// Ouverture du fichier
	for (i=0;i<6;i++)						// Lecture de l©entÞte
		fscanf(fich,"%s",titre);
	fscanf(fich,"%f%d%d"
			,&pas
			,&nbrSouris
			,&profondeur);				// Lecture des paramÜtres
	if ((strcmp(titre,"V2.0")==0)||(strcmp(titre,"V1.3")==0))
		{
		fscanf(fich,"%d",&couleur);
		if (titre[1] == '2')
			{
			fscanf(fich,"%f%f%f%f%f%f%f%f%f\n"
					,&r1,&v1,&b1,&r2,&v2,&b2,&rf,&vf,&bf);
			[couleur1 setColor:NXConvertRGBToColor(r1,v1,b1)];
			[couleur2 setColor:NXConvertRGBToColor(r2,v2,b2)];
			[couleurFond setColor:NXConvertRGBToColor(rf,vf,bf)];
			}
		}
	else couleur = 0;
	leMenu = [zoneCouleur target];
	laMatrice = [leMenu itemList];
	[laMatrice selectCellWithTag:couleur];
	[zoneCouleur setTitle:[[laMatrice selectedCell] title]];

	for (i=0;i<nbrSouris;i++)				// Lecture des positions initiales
		fscanf(fich,"%f%f ",&x[i],&y[i]);
	fclose(fich);							// Fermeture du fichier
	
	// Modification du titre de la fenÞtre
	strcpy(titre,"Of Mice And Men : ");
	strcat(titre,strrchr(nomdefichier,'/')+1);
	[fenetre setTitle:titre];
	
	// Transfert des paramÜtres vers l©interface graphique 
	[zonePas setFloatValue:pas at:0];		// Affectation au champ de texte
		// RÝcupÝration de la valeur par le target (ici, un slider)
	[[zonePas target] takeFloatValueFrom:zonePas];
	
	[zoneNbrSouris setIntValue:nbrSouris at:0];
	[[zoneNbrSouris target] takeFloatValueFrom:zoneNbrSouris];
	
	[zoneNbrIter setIntValue:profondeur at:0];
	[[zoneNbrIter target] takeFloatValueFrom:zoneNbrIter];
	
	for (i=0;i<nbrSouris;i++)
		{
		cellule = [matrice cellAt:(i*2):0];
		[cellule setFloatValue:x[i]];
		[[cellule target] takeFloatValueFrom:cellule];
		cellule = [matrice cellAt:(i*2+1):0];
		[cellule setFloatValue:y[i]];
		[[cellule target] takeFloatValueFrom:cellule];
		}

	[self calculer:self];

	[posPanel orderFront:self];	
	[paramPanel orderFront:self];
	[fenetre makeKeyAndOrderFront:self];	// Fait apparaätre la fenÞtre

	return self;
}
//
// Ecriture dans un fichier ASCII des donnÝes initiales et paramÜtres de l©image affichÝe
//
- sauver:sender
{
	id panneau;
	int i;
	FILE *fich;
	float r1,v1,b1,r2,v2,b2,rf,vf,bf;
	
	// Ouverture du SavePanel
	panneau = [SavePanel new];
	[panneau setRequiredFileType:"mice"];	// SpÝcifie l©extension des fichiers
	[panneau setTitle:"Save"];
	if ([panneau runModal])
		{
		fich = fopen([panneau filename],"w"); // Ouverture du fichier
		fprintf(fich,"Of Mice And Men - V2.0\n"); // Version du logiciel
		fprintf(fich,"%f %d %d %d\n"		//  Ecriture des paramÜtres
				,pas
				, nbrSouris
				,profondeur
				,couleur);
		NXConvertColorToRGB([couleur1 color],&r1,&v1,&b1);
		NXConvertColorToRGB([couleur2 color],&r2,&v2,&b2);
		NXConvertColorToRGB([couleurFond color],&rf,&vf,&bf);
	
		fprintf(fich,"%f %f %f %f %f %f %f %f %f\n",r1,v1,b1,r2,v2,b2,rf,vf,bf);
		for (i=0;i<nbrSouris;i++)
			fprintf(fich,"%f %f \n",x[i],y[i]);	// Ecriture des valeurs initiales
		fclose(fich);						// Fermeture du fichier
		};
	return self;
}

- nouveau : sender
{
int i;
id cellule;

	strcpy(nomdefichier,"Untitled.mice");
	[fenetre setTitle:nomdefichier];
	[zonePas setFloatValue:0.99 at:0];
	[[zonePas target] takeFloatValueFrom:zonePas];
	[zoneNbrSouris setIntValue:4 at:0];
	[[zoneNbrSouris target] takeFloatValueFrom:zoneNbrSouris];
	[zoneNbrIter setIntValue:100 at:0];
	[[zoneNbrIter target] takeFloatValueFrom:zoneNbrIter];
		
	for (i=0;i<10;i++)
		{
		cellule = [matrice cellAt:(i*2):0];
		[cellule setFloatValue:0.0];
		[[cellule target] takeFloatValueFrom:cellule];
		cellule = [matrice cellAt:(i*2+1):0];
		[cellule setFloatValue:0.0];
		[[cellule target] takeFloatValueFrom:cellule];
		}
	[self appDidInit:self];
	[graphe efface:self];
	[posPanel orderFront:self];	
	[paramPanel orderFront:self];
	[fenetre makeKeyAndOrderFront:self];
	return self;
}

- showInfo:sender
{

if (infoView == nil)
	{
	if ([NXApp loadNibSection: "info.nib" owner: self] == nil)
		{
		return nil;
		}
	}
[[infoView window] makeKeyAndOrderFront: nil];
[infoView animateInfo:self];
return self;

}

- (BOOL)appAcceptsAnotherFile:sender
{
return YES;
}

//
// Message reÛu par le delegate de l©application pour qu©il ouvre le fichier de nom filename
// et de type aType
//
- (int)app:sender openFile:(const char *)filename type:(const char *)aType
{
char titre[100];

strcpy(nomdefichier , filename);
strcpy(titre,"Of Mice And Men :");
strcat(titre,strrchr(filename,'/')+1); // Recherche le nom du fichier dans le path et l©ajoute au titre
[fenetre setTitle:titre];
if ([self charger:self])
	initialise = YES;
return 1;
}

//
// Message reÛu par le delegate de l©application au dÝmarrage de celle-ci
//
- appDidInit:sender;
{
if (!initialise)
	{
	[couleurFond setColor:NX_COLORBLACK];
	[couleur1 setColor:NX_COLORCLEAR];
	[couleur2 setColor:NX_COLORWHITE];
	}
[fenetre setMiniwindowIcon:"image2"];
return self;
}
@end
